Learn in 10 minutes

Learn in 10 minutes

10分钟学会Ruby

编程语言

Ruby是一种动态的、面向对象的编程语言,以其优雅的语法和开发者友好的特性而闻名。本教程涵盖Ruby的核心概念,帮助你快速学习这门语言。

1. 编写第一个Ruby程序

让我们从一个简单的程序开始。创建一个名为hello.rb的文件,输入以下代码:

puts "Hello, World!"

保存文件并在终端中运行以下命令:

ruby hello.rb

输出将是:

Hello, World!

这个简单的程序展示了Ruby的基本输出功能。puts方法用于在控制台中显示文本信息。

2. 基本语法

Ruby的语法简洁易读,设计得自然直观。

# 这是一个注释
puts "Hello, World!"

Ruby中的基本语法规则:

  • 注释:单行注释以#开头,多行注释使用=begin=end
  • 语句:通常每行一个语句,末尾不需要分号;
  • 代码块:由do...end或花括号{}定义。
  • 方法调用:对于没有参数的方法调用,括号是可选的。

多行注释示例:

=begin
这是一个多行注释,
跨越多行。
=end

3. 变量和数据类型

在Ruby中,变量是动态类型的,不需要显式类型声明。

基本变量命名规则

  • 变量名只能包含字母、数字和下划线。
  • 变量名不能以数字开头。
  • 变量名区分大小写。
  • Ruby关键字不能用作变量名。

Ruby的主要基本数据类型有

  • 整数(Integer):例如42-10
  • 浮点数(Float):例如3.142.5e3
  • 字符串(String):例如"hello"'world',使用单引号或双引号。
  • 布尔值(Boolean)truefalse
  • Nil值(Nil):由nil表示,表示空或无值。
  • 符号(Symbol):例如:name,不可变的标识符。

3.1 数值类型

Ruby支持整数和浮点数。

# 整数
age = 25
population = 1_000_000  # 使用下划线提高可读性

# 浮点数
temperature = 36.5
pi = 3.14159

# 运算
puts 10 + 5   # 15
puts 10 / 3   # 3(整数除法)
puts 10.0 / 3 # 3.333...(浮点数除法)

3.2 字符串

字符串是字符序列,用单引号或双引号括起来。

single_quote = '单引号字符串'
double_quote = "双引号字符串"
multiline = "这是一个
多行字符串"

# 字符串插值(仅在双引号中有效)
name = "Alice"
greeting = "Hello, #{name}!"
puts greeting  # "Hello, Alice!"

字符串操作:

text = "Ruby编程"
puts text.length        # 字符串长度
puts text.upcase        # 转换为大写
puts text.downcase      # 转换为小写
puts text[0]            # 访问第一个字符
puts text[0..3]         # 字符串切片
puts text.include?("Ruby")  # 检查是否包含

3.3 布尔类型

布尔类型有两个值:truefalse

is_active = true
is_complete = false

# 布尔运算
result1 = true && false  # false
result2 = true || false  # true
result3 = !true          # false

3.4 Nil类型

nil表示空或无值的状态。

value = nil

if value.nil?
  puts "值为空"
end

3.5 符号

符号是不可变的标识符,通常用作哈希中的键。

:name
:email
:created_at

# 符号与字符串的比较
puts :name.object_id == :name.object_id  # true(相同对象)
puts "name".object_id == "name".object_id  # false(不同对象)

4. 数据结构

Ruby提供了几种内置的数据结构来存储和操作数据。

4.1 数组

数组是一个有序集合,可以容纳多个值。

numbers = [1, 2, 3, 4, 5]
numbers.push(6)        # 添加元素
numbers.unshift(0)     # 在开头插入
numbers.delete(3)      # 删除特定值
numbers[0] = 10        # 修改元素
puts numbers.inspect   # [10, 2, 4, 5, 6]

数组操作:

numbers = [10, 20, 30, 40, 50]
puts numbers[1..3]     # [20, 30, 40]
puts numbers.first     # 10
puts numbers.last      # 50
puts numbers.include?(30)  # true

4.2 哈希

哈希是键值对的集合,类似于其他语言中的字典。

student = {
  name: "John",
  age: 20,
  major: "Computer Science"
}

# 访问和修改哈希
puts student[:name]
student[:age] = 21
student[:gpa] = 3.8

# 遍历哈希
student.each do |key, value|
  puts "#{key}: #{value}"
end

5. 控制流

Ruby提供了几种控制流语句来管理程序执行。

5.1 if语句

if语句评估条件,如果条件为真则执行其代码块。

age = 20
if age >= 18
  puts "成年人"
elsif age >= 13
  puts "青少年"
else
  puts "儿童"
end

# 单行if
puts "成年人" if age >= 18

5.2 unless语句

unlessif相反 - 当条件为假时执行。

age = 15
unless age >= 18
  puts "不是成年人"
end

# 单行unless
puts "不是成年人" unless age >= 18

5.3 case语句

case语句提供了一种处理多个条件的简洁方式。

grade = "B"

case grade
when "A"
  puts "优秀"
when "B"
  puts "良好"
when "C"
  puts "一般"
else
  puts "需要改进"
end

5.4 循环

Ruby支持各种循环结构。

while循环

count = 0
while count < 5
  puts count
  count += 1
end

until循环

count = 0
until count >= 5
  puts count
  count += 1
end

for循环

for i in 0..4
  puts i
end

each迭代器

(0..4).each do |i|
  puts i
end

# 使用数组
fruits = ["apple", "banana", "cherry"]
fruits.each do |fruit|
  puts fruit
end

break和next

(0..9).each do |i|
  break if i == 5     # 退出循环
  next if i % 2 == 0  # 跳过偶数
  puts i              # 输出:1, 3
end

6. 方法

Ruby中的方法使用def关键字定义。

基本方法定义

def greet(name)
  "Hello, #{name}!"
end

# 调用方法
message = greet("John")
puts message

默认参数

def greet(name, greeting = "Hello")
  "#{greeting}, #{name}!"
end

puts greet("Alice")          # "Hello, Alice!"
puts greet("Bob", "Hi")      # "Hi, Bob!"

可变参数

def sum_numbers(*numbers)
  numbers.sum
end

puts sum_numbers(1, 2, 3, 4)  # 10

关键字参数

def create_person(name:, age:, city: "Unknown")
  { name: name, age: age, city: city }
end

person = create_person(name: "Alice", age: 25)
puts person.inspect

7. 块和Procs

块是可以传递给方法的代码块。

使用块

# 使用 do...end
3.times do
  puts "Hello!"
end

# 使用花括号
3.times { puts "Hello!" }

# 带参数的块
(1..3).each do |number|
  puts "Number: #{number}"
end

Yield关键字

def run_block
  puts "块之前"
  yield
  puts "块之后"
end

run_block { puts "块内部" }

Procs

Procs是封装块的对象。

square = Proc.new { |x| x * x }
puts square.call(5)  # 25

# 将procs传递给方法
def apply_operation(numbers, operation)
  numbers.map { |n| operation.call(n) }
end

numbers = [1, 2, 3, 4]
squares = apply_operation(numbers, square)
puts squares.inspect  # [1, 4, 9, 16]

8. 类和对象

Ruby是一种纯面向对象语言,所有东西都是对象。

基本类定义

class Person
  def initialize(name, age)
    @name = name
    @age = age
  end

  def introduce
    "我是#{@name}#{@age}岁"
  end

  def have_birthday
    @age += 1
    "#{@name}过生日了,现在#{@age}岁"
  end
end

# 创建对象
person1 = Person.new("John", 25)
person2 = Person.new("Jane", 30)

puts person1.introduce
puts person2.have_birthday

访问器方法

class Person
  attr_reader :name    # 读取访问
  attr_writer :age     # 写入访问
  attr_accessor :city  # 读写访问

  def initialize(name, age, city)
    @name = name
    @age = age
    @city = city
  end
end

person = Person.new("Alice", 25, "New York")
puts person.name      # "Alice"
person.age = 26       # 设置年龄
person.city = "Boston" # 设置城市
puts person.city      # "Boston"

类方法和变量

class Student
  @@student_count = 0  # 类变量

  def initialize(name)
    @name = name
    @@student_count += 1
  end

  def self.student_count  # 类方法
    @@student_count
  end
end

student1 = Student.new("John")
student2 = Student.new("Jane")
puts Student.student_count  # 2

继承

class Animal
  def initialize(name)
    @name = name
  end

  def speak
    "#{@name}发出声音"
  end
end

class Dog < Animal
  def speak
    "#{@name}汪汪叫"
  end
end

class Cat < Animal
  def speak
    "#{@name}喵喵叫"
  end
end

dog = Dog.new("Buddy")
cat = Cat.new("Mimi")

puts dog.speak  # "Buddy汪汪叫"
puts cat.speak  # "Mimi喵喵叫"

9. 模块和Mixins

模块用于分组相关的方法和常量,可以混入类中。

模块定义

module Speakable
  def speak
    "#{@name}说了些什么"
  end
end

class Person
  include Speakable

  def initialize(name)
    @name = name
  end
end

person = Person.new("Alice")
puts person.speak  # "Alice说了些什么"

使用模块命名空间

module Math
  PI = 3.14159

  def self.square(x)
    x * x
  end
end

puts Math::PI        # 3.14159
puts Math.square(5)  # 25

10. 异常处理

Ruby使用beginrescueensureraise提供了强大的异常处理功能。

基本异常处理

begin
  result = 10 / 0
rescue ZeroDivisionError => e
  puts "不能除以零:#{e.message}"
else
  puts "除法成功"
ensure
  puts "这总是会运行"
end

抛出异常

def divide(a, b)
  raise "不能除以零" if b == 0
  a / b
end

begin
  result = divide(10, 0)
rescue => e
  puts "错误:#{e.message}"
end

11. 文件操作

Ruby提供了简单的方法来读写文件。

读取文件

# 读取整个文件
content = File.read("example.txt")
puts content

# 逐行读取
File.foreach("example.txt") do |line|
  puts line.chomp
end

写入文件

# 写入文件
File.write("output.txt", "Hello, Ruby!\n")

# 追加到文件
File.open("output.txt", "a") do |file|
  file.puts "追加新内容。"
end

12. 有用的内置方法

Ruby自带许多有用的内置方法。

字符串方法

text = "  Ruby编程  "
puts text.strip        # 移除空白
puts text.split(" ")   # 分割成数组
puts text.gsub("Ruby", "Python")  # 替换

数组方法

numbers = [3, 1, 4, 1, 5, 9, 2]
puts numbers.sort.inspect      # [1, 1, 2, 3, 4, 5, 9]
puts numbers.uniq.inspect      # [3, 1, 4, 5, 9, 2]
puts numbers.select { |n| n > 3 }.inspect  # [4, 5, 9]

哈希方法

person = { name: "Alice", age: 25, city: "New York" }
puts person.keys.inspect    # [:name, :age, :city]
puts person.values.inspect  # ["Alice", 25, "New York"]
puts person.has_key?(:age)  # true

13. Ruby Gems

RubyGems是Ruby的包管理器,用于安装和管理库。

安装Gems

gem install rails

在代码中使用Gems

require 'json'

# 解析JSON
json_string = '{"name": "Alice", "age": 25}'
person = JSON.parse(json_string)
puts person["name"]  # "Alice"

# 生成JSON
person_hash = { name: "Bob", age: 30 }
json_output = JSON.generate(person_hash)
puts json_output  # {"name":"Bob","age":30}

14. Ruby风格指南

Ruby有一个强大的社区风格指南,提倡编写干净、可读的代码。

缩进:使用2个空格进行缩进。

命名约定

  • 变量和方法:snake_case
  • 类和模块:CamelCase
  • 常量:SCREAMING_SNAKE_CASE

括号:对于带参数的方法调用使用括号,对于不带参数的方法调用省略括号。

代码块:对于多行代码块使用do...end,对于单行代码块使用{}

Ruby优雅的语法和强大的特性使其使用起来非常愉快。它关注开发者的幸福感和生产力,使其在Web开发、脚本编写和自动化任务中广受欢迎。